package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

@RestController
@RequestMapping("/shoppingCart")
@Slf4j
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService shoppingCartService;

    /**
     * 添加数据到购物车（实际将数据添加到 shopping_cart 表中）
     * @param shoppingCart 保存 菜品+口味id or 套餐id
     * @return 返回添加后的实体对象
     */
    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart) {
        // 1.获取用户id，指定当前是那个用户的购物车数据
        Long id = BaseContext.getCurrentId();
        shoppingCart.setUserId(id);

        // 2.查询当前菜品 or 套餐是否在购物车中(是否已经添加到了表)
        // 2-1 创建查询条件
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        // 2-2 查询的是当前这个用户在购物车的数据
        wrapper.eq(ShoppingCart::getUserId, id);
        // 2-3 如果前端传入了 dishId，说明添加的是菜品，此时就查询这个菜品
        wrapper.eq(shoppingCart.getDishId() != null , ShoppingCart::getDishId, shoppingCart.getDishId());
        // 2-4 如果前端传入了 setmealId，说明添加的是套餐，此时就查询这个套餐
        wrapper.eq(shoppingCart.getSetmealId() != null, ShoppingCart::getSetmealId, shoppingCart.getSetmealId());
        // 2-5 进行条件查询
        ShoppingCart queryResult = shoppingCartService.getOne(wrapper);

        // 根据数据是否在数据库，进行操作
        if (queryResult != null) {
            // 3.如果已经在购物车中，就在原来的数量上加一
            // 当前菜品/套餐已点的数量再 + 1
            int number = queryResult.getNumber() + 1;
            queryResult.setNumber(number);
            shoppingCartService.updateById(queryResult);
        } else {
            // 4.如果不存在，则将这条信息添加到购物车中
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartService.save(shoppingCart);
            queryResult = shoppingCart;
        }

        return R.success(queryResult);
    }

    /**
     * 展示购物车列表
     * @return 返回当前用户所有已经选择的菜品
     */
    @GetMapping("/list")
    public R<List<ShoppingCart>> list() {
        // 构造条件
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        // 查询当前用户所有选择的菜品
        wrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
        // 根据时间降序排序
        wrapper.orderByDesc(ShoppingCart::getCreateTime);

        // 查询并返回
        List<ShoppingCart> list = shoppingCartService.list(wrapper);
        return R.success(list);
    }

    /**
     * 清空当前用户的购物车
     * @return 返回是否成功清空的消息
     */
    @DeleteMapping("/clean")
    public R<String> clean() {
        // 创建查询条件
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        // 获取当前用户相关的所有数据
        wrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());

        // 调用service，删除所有数据
        boolean remove = shoppingCartService.remove(wrapper);

        if (remove) {
            return R.success("清空购物车成功");
        } else {
            return R.error("清空购物车失败");
        }
    }
}
